x

Интерфейсы

  • Интерфейс - тип данных
  • Описывает только поведение без реализации
  • Контракт интерфейса определяет, что делает класс, но не определяет как он это делает
  • У класса может быть единственный класс-предок
  • Класс может реализовывать много интерфейсов

Принципы интерфейсов

  • Отсутствие состояния
  • Нет конструкторов
  • Множественная реализация
  • Полная абстракция поведения

Определение интерфейсов

  • Ключевое слово interface
  • Все методы по умолчанию public abstract
  • Все поля public static final
  • Реализация - ключевое слово implements

Наследование интерфейсов

Интерфейс может расширять другие интерфейсы (несколько)

interface I extends I1, I2, I3 { }

Методы

  • Абстрактные - основной контракт
  • Методы с реализацией по умолчанию - default
  • Статические
  • Приватные
  • protected - запрещены, ошибка компиляции

Default методы

  • Реализация вспомогательного поведения в интерфейсе
  • Необязательное переопределение в классах
  • Если в двух интерфейсах есть default-методы с одинаковым именем - класс обязан их переопределить. Можно взять реализацию через InterfaceName.super.methodName
interface I1 {
    default void print() {
        print("Hello");
    }
}
interface I2 {
    default void print() {
        print("Bye");
    }
}
class A implements I1, I2 {
    @Override
    public void print() {
        I1.super.print(); // можно взять реализацию
        I2.super.print();
    } 
}
// Hello
// Bye

Static методы

  • Принадлежат интерфейсу, а не экземплярам
  • Вызов через InterfaceName.methodName
  • Не наследуются
  • Утилитарные функции

Private методы

  • Вспомогательный код

Вложенные интерфейсы

Интерфейсы, как и классы могут быть вложенными

class Printer{
    interface Printable {
        void print();
    }
}
class Book implements Printer.Printable {
    public void print() {
        System.out.println("Печатаем книгу");
    }  
}
Printer.Printable printable = new Book();
printable.print();

Могут вкладываться и в другие интерфейсы

public interface OuterInterface {
    void outerMethod();

    interface InnerInterface {
        void innerMethod();
    }
}

public class MyClass implements OuterInterface, OuterInterface.InnerInterface {
    @Override
    public void outerMethod() {
        System.out.println("Метод внешнего интерфейса");
    }

    @Override
    public void innerMethod() {
        System.out.println("Метод вложенного интерфейса");
    }
}

Дополнительно: Абстрактные классы,

Left-click: follow link, Right-click: select node, Scroll: zoom
x